﻿//有 n 个学生站成一排，每个学生有一个能力值，牛牛想从这 n 个学生中按照顺序选取 k 名学生，
//要求相邻两个学生的位置编号的差不超过 d，使得这 k 个学生的能力值的乘积最大，你能返回最大的乘积吗？
//
//输入描述：
//每个输入包含 1 个测试用例。
//每个测试数据的第一行包含一个整数 n(1 <= n <= 50)，表示学生的个数，
//接下来的一行，包含 n 个整数，按顺序表示每个学生的能力值 ai（ - 50 <= ai <= 50）。
//接下来的一行包含两个整数，k 和 d(1 <= k <= 10, 1 <= d <= 50)。
//输出描述：
//输出一行表示最大的乘积。
//
//输入：
//	3
//	7 4 7
//	2 50
//输出：
//	49

#include <iostream>
using namespace std;
typedef long long LL;
const int N = 55, M = 15;
const LL INF = 0x3f3f3f3f3f3f3f3f;
int n, k, d;
LL arr[N];
LL f[N][M], g[N][M];
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> arr[i];
    cin >> k >> d;
    // 初始化放在填表中进⾏了
    for (int i = 1; i <= n; i++) { // 填写每⼀⾏
        g[i][1] = f[i][1] = arr[i];
        for (int j = 2; j <= min(i, k); j++) { // 挑选⼏个⼈
            f[i][j] = -INF; // 初始化g[i][j] = INF; // 初始化
            for (int prev = max(i - d, j - 1); prev <= i - 1; prev++) // 前⾯挑选的最后⼀个位置 
            {
                f[i][j] = max(max(f[prev][j - 1] * arr[i], g[prev][j - 1] *
                    arr[i]), f[i][j]);
                g[i][j] = min(min(f[prev][j - 1] * arr[i], g[prev][j - 1] *
                    arr[i]), g[i][j]);
            }
        }
    }
    LL ret = -INF;
    for (int i = k; i <= n; i++) ret = max(ret, f[i][k]);
    cout << ret << endl;
    return 0;
}








